﻿using System;

namespace _14csharp_面相对像
{
    class Program
    {
        static void Main(string[] args)
        {
            Derived dd = new Derived("男", 18);

        }
    }

    class Base
    {
        public string sex;
        public Base()
        {
            Console.WriteLine("Inside Base Class"); //in 在...里面 ，side ：一边 ；inside=在里面
        }

        // 有参数构造函数
        public Base(string sex)
        {
            //this : 这，这里、这个，在c# 中用来表示这个类型的实例（对象）自身
            this.sex = sex;
            Console.WriteLine($"inside derived class , sex={sex} ");
        }


        public void Eat() { }
    }


    class Derived : Base
    {
        public int age;
        public string name;
        // 子类、派生类 的无参构造函数，使用 :base() 的方式唤起基类的默认初始化行为
        // 构造函数用于初始化一个类型里面的数据。
        // base：基地，基础，基：垫底的，底层的。
        // base: 一般代表了基类
        // base() :代表基类的构造函数
        // base.Eat() :代表了基类的一个常规的方法
        // base.age：基类中的字段

        // 他的调用顺序，调用行为 ：两个都会调用，先调用基类，再调用子类构造函数
        // 无参的构造会默认调用基类中的无参构造
        //public Derived() : base()
        public Derived()
        {
            //base.sex;
            //base.Eat();
            Console.WriteLine("insede Derived class");
        }
        // 有参构造函数，使用 :base(参数)  的形式用于调用基类中的有参构造函数来初始化
        // 优势：子类可以省下初始化某个参数的过程
        public Derived(string sex, int age) : base(sex)
        {
            this.age = age;
            Console.WriteLine($"inside derived class , sex={this.sex} - age ={this.age}");
        }
        public Derived(string name, string sex, int age) : this(sex: sex, age: age)  //sex: 和 age： 是声明对指定的参数进行赋值
        {
            this.name = name;
        }
    }
}
